﻿using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioUnidadeFederativa : IRepositorioUnidadeFederativa
    {
        public UnidadeFederativa Inserir(UnidadeFederativa unidadeFederativa)
        {
            //foreach (Cidade cidade in unidadeFederativa.ListaCidades)
            //{
            //    cidade.UnidadeFederativa = unidadeFederativa;
            //}

            GerenciadorBDConfigs.Instance.SessaoAtual().Save(unidadeFederativa);
            return unidadeFederativa;
        }

        public UnidadeFederativa Atualizar(UnidadeFederativa unidadeFederativa)
        {
            UnidadeFederativa tmpUnidadeFederativa = ObterPorId(unidadeFederativa.UnidadeFederativaId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpUnidadeFederativa.Codigo = unidadeFederativa.Codigo;
            tmpUnidadeFederativa.Descricao = unidadeFederativa.Descricao;
            tmpUnidadeFederativa.NeturionLog = unidadeFederativa.NeturionLog;
            tmpUnidadeFederativa.Pais = unidadeFederativa.Pais;
            tmpUnidadeFederativa.Sigla = unidadeFederativa.Sigla;
            //tmpUnidadeFederativa.ListaCidades.Clear();
            //foreach (Cidade cidade in unidadeFederativa.ListaCidades)
            //{
            //    tmpUnidadeFederativa.AdicionarCidade(cidade);
            //}

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpUnidadeFederativa);
            return tmpUnidadeFederativa;
        }

        public void Excluir(UnidadeFederativa unidadeFederativa)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(unidadeFederativa);
        }

        public IList<UnidadeFederativa> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(UnidadeFederativa));
            return criteria.List<UnidadeFederativa>() as List<UnidadeFederativa>;
        }

        public UnidadeFederativa ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<UnidadeFederativa>(id);
        }

        public int ObterUltimoIdCodigoInteiro()
        {
            string[] literal = new string[] 
                {"a","b","c","d","e","f","g","h","i","j"
                ,"l","m","n","o","p","q","r","s","t","u","v","x","z","y"
                ,"w"};

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(UnidadeFederativa)).SetMaxResults(1);

            for (int i = 0; i <= literal.Length - 1; i++)
            {
                criteria.Add(Restrictions.Not(Restrictions.Like("Codigo", literal[i], MatchMode.Anywhere)));
            }

            criteria.AddOrder(Order.Desc("UnidadeFederativaId"));


            UnidadeFederativa unidadeFederativa = criteria.UniqueResult<UnidadeFederativa>();
            int ultimoCodigo = unidadeFederativa != null ? unidadeFederativa.UnidadeFederativaId : 0;

            return ultimoCodigo;
        }

        public UnidadeFederativa ObterPorCodigo(string codigo)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(UnidadeFederativa))
                .Add(Restrictions.Eq("Codigo", codigo));

            return criteria.UniqueResult<UnidadeFederativa>() as UnidadeFederativa;
        }

        public UnidadeFederativa ObterPorSigla(string sigla)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(UnidadeFederativa))
               .Add(Restrictions.Eq("Sigla", sigla));

            return criteria.UniqueResult<UnidadeFederativa>() as UnidadeFederativa;
        }
    }
}